home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / wstype / source / roll.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  7KB  |  301 lines

  1. /***   [roll.c]
  2. *
  3. *    画面スクロール        (C)ささがわ
  4. *
  5. *    For GNU C Compiler (GCC)   Version 1.39
  6. *
  7. ***/
  8.  
  9. #include <stdlib.h>
  10. #include <mos.h>
  11. #include "graph.h"
  12. #include "txwind.h"
  13.  
  14. extern int    PAL_MOJI, PAL_Back, PAL_Black;
  15. static struct txinfo_t    *Info;
  16. static int    Vg, Hg, Vw, Hw;
  17. static int    CORD[4], DISPOFF;
  18.  
  19. static void    Draw_line(int);
  20. static void    Seikika(int *);
  21. static void    Cls_line(int);
  22. static void    ROL_horizon_sub(int);
  23.  
  24. void ROL_init(struct txinfo_t *txi, int x1, int y1, int x2, int y2) {
  25.     int        i;
  26.     
  27.     Info = txi;
  28.     CORD[0] = x1;    CORD[1] = y1;
  29.     CORD[2] = x2;    CORD[3] = y2;
  30.     Vg = Info->fontx + Info->linegap;
  31.     Hg = Info->fontx / 2;
  32.     Vw = (CORD[3] - CORD[1] + 1 + Info->linegap) / Vg;
  33.     Hw = (CORD[2] - CORD[0] + 1) / Hg;
  34.     DISPOFF = 0;
  35.     Info->_line = 0;    Info->_col = 0;
  36.     
  37.     EGB_actPage(0);
  38.     EGB_cls(PAL_Back);
  39.     EGB_Hscrl(0, DISPOFF);
  40.     for (i = 0; i < Vw; i++)
  41.         Draw_line(i);
  42.     EGB_actPage(1);
  43. }
  44.  
  45. static void Draw_line(int l) {
  46.     int        y;
  47.     struct bmgr_t    bm;
  48.     unsigned char    str[100];
  49.     
  50.     if (Info->line + l >= Info->file.line)
  51.         return;
  52.     
  53.     bm.tabm = Info->tabd;    bm.crm = Info->crd;
  54.     bm.fs = &Info->file;
  55.     bm.line = l + Info->line;
  56.     bm.l = Info->col;
  57.     bm.r = Info->col + Hw - 1;
  58.     bm.tab = Info->tab;
  59.     BMGR_String(&bm, str);
  60.     
  61.     y = (DISPOFF + CORD[1] + l * Vg + Info->fontx - 1) % 512;
  62.     EGB_str3((char *)str, CORD[0], y, PAL_MOJI, PAL_Back);
  63.     if (y < Info->fontx - 1)
  64.         EGB_str3((char *)str, CORD[0], y + 512, PAL_MOJI, PAL_Back);
  65. }
  66.  
  67. int ROL_vertical(int w) {
  68.     if (w > 0 && Info->line + Vw >= Info->file.line)
  69.         return 1;
  70.     else if (w < 0 && Info->line == 0 && Info->_line == 0)
  71.         return 1;
  72.     else if (w == 0 || abs(w) > Vg)
  73.         return 0;
  74.     
  75.     EGB_actPage(0);
  76.     if (w > 0) {        /* 前進 */
  77.         if (Info->_line == 0)
  78.             Cls_line(1);
  79.         if (Info->_line + w >= Vg) {
  80.             EGB_Hscrl(0, DISPOFF += Vg - Info->_line);
  81.             Seikika(&DISPOFF);
  82.             Info->line++;
  83.             w -= Vg - Info->_line;
  84.             Info->_line = 0;
  85.             Draw_line(Vw - 1);
  86.             if (w != 0 && Info->line + Vw != Info->file.line) {
  87.                 Cls_line(1);
  88.                 EGB_Hscrl(0, DISPOFF += w);
  89.                 Info->_line = w;
  90.             }
  91.         } else {
  92.             EGB_Hscrl(0, DISPOFF += w);
  93.             Info->_line += w;
  94.         }
  95.     } else {        /* 後進 */
  96.         if (Info->_line == 0) {
  97.             Cls_line(0);
  98.             Info->line--;
  99.             EGB_Hscrl(0, DISPOFF += w);
  100.             if (-w == Vg) {
  101.                 Seikika(&DISPOFF);
  102.                 Draw_line(0);
  103.             } else {
  104.                 Info->_line = Vg + Info->_line + w;
  105.             }
  106.         } else if (Info->_line + w <= 0) {
  107.             EGB_Hscrl(0, DISPOFF -= Info->_line);
  108.             Seikika(&DISPOFF);
  109.             w += Info->_line;
  110.             Info->_line = 0;
  111.             Draw_line(0);
  112.             if (w > 0 && Info->line != 0) {
  113.                 Cls_line(0);
  114.                 EGB_Hscrl(0, DISPOFF += w);
  115.                 Info->line--;
  116.                 Info->_line = Vg + w;
  117.             }
  118.         } else {
  119.             EGB_Hscrl(0, DISPOFF += w);
  120.             Info->_line += w;
  121.         }
  122.     }
  123.     Seikika(&DISPOFF);
  124.     EGB_actPage(1);
  125.     
  126.     if (w > 0 && Info->line + Vw >= Info->file.line)
  127.         return 1;
  128.     else if (w < 0 && Info->line == 0 && Info->_line == 0)
  129.         return 1;
  130.     else
  131.         return 0;
  132. }
  133.  
  134. static void Seikika(int *a) {
  135.     if (*a < 0) {
  136.         while (*a < 0)
  137.             *a += 512;
  138.     } else if (*a >= 512) {
  139.         *a %= 512;
  140.     }
  141. }
  142.  
  143. static void Cls_line(int mode) {
  144.     int        y;
  145.     
  146.     y = DISPOFF + (mode ? CORD[3] + 1 : CORD[1] - Vg);
  147.     Seikika(&y);
  148.     EGB_boxf(CORD[0], y, CORD[2], y + Vg - 1, PAL_Back, PAL_Back);
  149.     if (y >= 512 - Vg) {
  150.         y -= 512;
  151.         EGB_boxf(CORD[0], y, CORD[2], y + Vg - 1, PAL_Back, PAL_Back);
  152.     }
  153. }
  154.  
  155. int ROL_horizon(int w) {
  156.     if (w > 0 && Info->col + Hw >= (Info->lgcolw ? Hw : Info->lgcol))
  157.         return 1;
  158.     else if (w < 0 && Info->col == 0 && Info->_col == 0)
  159.         return 1;
  160.     else if (w == 0 || abs(w) > Hg)
  161.         return 0;
  162.     
  163.     EGB_actPage(0);
  164.     if (w > 0) {        /* 前進 */
  165.         if (Info->_col + w >= Hg) {
  166.             Info->col++;
  167.             ROL_horizon_sub(1);
  168.             if (Info->col + Hw == (Info->lgcolw ? Hw : Info->lgcol))
  169.                 Info->_col = 0;
  170.             else
  171.                 Info->_col = Info->_col + w - Hg;
  172.         } else {
  173.             Info->_col += w;
  174.         }
  175.     } else {        /* 後進 */
  176.         if (Info->_col + w < 0) {
  177.             Info->col--;
  178.             ROL_horizon_sub(0);
  179.             if (Info->col == 0)
  180.                 Info->_col = 0;
  181.             else
  182.                 Info->_col = Hg + Info->_col + w;
  183.         } else {
  184.             Info->_col += w;
  185.         }
  186.     }
  187.     EGB_actPage(1);
  188.     
  189.     if (w > 0 && Info->col + Hw >= (Info->lgcolw ? Hw : Info->lgcol))
  190.         return 1;
  191.     else if (w < 0 && Info->col == 0 && Info->_col == 0)
  192.         return 1;
  193.     else
  194.         return 0;
  195. }
  196.  
  197. #define FNTV    (Info->fontx)
  198. #define FNTH    (Info->fontx / 2)
  199. #define PRINT(x, y)        EGB_str3((char *)buf, x, y, PAL_MOJI, PAL_Back);
  200. static void ROL_horizon_sub(int c) {
  201.     int        l, a, y1, y2;
  202.     unsigned char    buf[5];
  203.     struct bmgr_t    bm;
  204.     struct bmgrctype_t    ct;
  205.     
  206.     y1 = (DISPOFF + CORD[1]) % 512;
  207.     y2 = y1 + FNTV - 1;
  208.     bm.tabm = Info->tabd;    bm.crm = Info->crd;
  209.     bm.fs = &Info->file;
  210.     bm.l = Info->col;
  211.     bm.r = Info->col + Hw - 1;
  212.     bm.tab = Info->tab;
  213.     
  214.     EGB_actPage(0);
  215.     for (l = 0; l < Vw && l + Info->line < Info->file.line; l++) {
  216.         bm.line = l + Info->line;
  217.         BMGR_ctype(&bm, &ct);
  218.         if (c) {
  219.             if (ct.r == 1) {
  220.                 buf[0] = ct.rcode;
  221.                 buf[1] = '\0';
  222.             } else if (ct.r == 3) {
  223.                 buf[0] = ct.rcode >> 8;
  224.                 buf[1] = ct.rcode & 0xff;
  225.                 buf[2] = '\0';
  226.             }
  227.             
  228.             a = ct.r == 0 || ct.r == 2 ? 1 : 0;
  229.             EGB_scrl(a, CORD[0], y1, CORD[2], y2, -FNTH, 0);
  230.             if (y2 >= 512)
  231.                 EGB_scrl(a, CORD[0], 0, CORD[2], y2 - 512, -FNTH, 0);
  232.             
  233.             if (ct.r == 1) {
  234.                 PRINT(CORD[2] - FNTH + 1, y2);
  235.                 if (y2 >= 512)
  236.                     PRINT(CORD[2] - FNTH + 1, y2 - 512);
  237.             } else if (ct.r == 3) {
  238.                 PRINT(CORD[2] - FNTV + 1, y2);
  239.                 if (y2 >= 512)
  240.                     PRINT(CORD[2] - FNTV + 1, y2 - 512);
  241.             }
  242.             
  243.             if (ct.l == 3) {
  244.                 EGB_boxf(CORD[0], y1, CORD[0] + FNTH - 1, y2, PAL_Back, PAL_Back);
  245.                 if (y2 >= 512)
  246.                     EGB_boxf(CORD[0], y1 - 512, CORD[0] + FNTH - 1, y2 - 512, PAL_Back, PAL_Back);
  247.             }
  248.         } else {
  249.             if (ct.l == 1) {
  250.                 buf[0] = ct.lcode;
  251.                 buf[1] = '\0';
  252.             } else if (ct.l == 2) {
  253.                 buf[0] = ct.lcode >> 8;
  254.                 buf[1] = ct.lcode & 0xff;
  255.                 buf[2] = '\0';
  256.             }
  257.             
  258.             a = ct.l == 0 || ct.l == 3 ? 1 : 0;
  259.             EGB_scrl(a, CORD[0], y1, CORD[2], y2, FNTH, 0);
  260.             if (y2 >= 512)
  261.                 EGB_scrl(a, CORD[0], 0, CORD[2], y2 - 512, FNTH, 0);
  262.             
  263.             if (ct.l == 1) {
  264.                 PRINT(CORD[0], y2);
  265.                 if (y2 >= 512)
  266.                     PRINT(CORD[0], y2 - 512);
  267.             } else if (ct.l == 2) {
  268.                 PRINT(CORD[0], y2);
  269.                 if (y2 >= 512)
  270.                     PRINT(CORD[0], y2 - 512);
  271.             }
  272.             
  273.             if (ct.r == 2) {
  274.                 EGB_boxf(CORD[2] - FNTH + 1, y1, CORD[2], y2, PAL_Back, PAL_Back);
  275.                 if (y2 >= 512)
  276.                     EGB_boxf(CORD[2] - FNTH + 1, y1 - 512, CORD[2], y2 - 512, PAL_Back, PAL_Back);
  277.             }
  278.         }
  279.         y1 += Vg;
  280.         y1 %= 512;
  281.         y2 = y1 + FNTV - 1;
  282.     }
  283.     EGB_actPage(1);
  284. }
  285. #undef FNTV
  286. #undef FNTH
  287. #undef PRINT
  288.  
  289. void ROL_end(int wy, int x, int y) {
  290.     MOS_disp(0);
  291.     if (DISPOFF + CORD[1] >= 512) {
  292.         EGB_mycopy(0, CORD[0], DISPOFF + CORD[1] - 512, CORD[2], DISPOFF + CORD[3] - 512, 1, x, y);
  293.     } else if (DISPOFF + CORD[3] < 512) {
  294.         EGB_mycopy(0, CORD[0], DISPOFF + CORD[1], CORD[2], DISPOFF + CORD[3], 1, x, y);
  295.     } else {
  296.         EGB_mycopy(0, CORD[0], DISPOFF + CORD[1], CORD[2], 511, 1, x, y);
  297.         EGB_mycopy(0, CORD[0], 0, CORD[2], DISPOFF + CORD[3] - 512, 1, x, 512 - DISPOFF + wy);
  298.     }
  299.     MOS_disp(1);
  300. }
  301.